package com.bit.cfdi.web.dao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import org.springframework.dao.DataAccessException;

import com.bit.cfdi.web.domain.Comprobante;
import com.bit.cfdi.web.domain.Negocio;

public interface ComprobanteDAO {

	public List<Comprobante> getTotalPorClienteFecha(final Long idCliente,
			final Calendar fechaInicio, final Calendar fechaFin) throws DataAccessException;
	
	public Double getSumTotalPorClienteFecha(final Long idCliente,
			final Calendar fechaInicio, final Calendar fechaFin) throws DataAccessException;
	
	public void save(final Comprobante comprobante) throws DataAccessException;

	public Comprobante getById(final Long id) throws DataAccessException;

	public List<Comprobante> getAll() throws DataAccessException;

	public Comprobante getByUUID(final String uUID) throws DataAccessException;
	
	public Comprobante getBySerieFolioAndRFCEmisor(final String serie, 
			final String folio, final String rfcEmisor) throws DataAccessException;
	
	@SuppressWarnings("rawtypes")
	public List getComprobanteByNegocio(final Negocio negocio, 
			final HashMap<String, Object> criterios, final List<String> extras, 
			final int start, final int end) throws DataAccessException;
	
	@SuppressWarnings("rawtypes")
	public List getComprobanteByAllFieldsReport(final Negocio negocio,
			final String toSearch, final List<String> extras) throws DataAccessException;
	
	public ArrayList<Object> getByUUIDLike(final String uUID, 
			final Negocio negocio) throws DataAccessException;
	
	/**
	 * Retrieve the Comprobante related to a Negocio with a certain Serie as string
	 * @param negocio
	 * @param serie
	 * @return
	 */
	public List<Comprobante> getComprobantesBySerie(final Negocio negocio, 
			final String serie) throws DataAccessException;
	
	/**
	 * Save a list of Comprobante
	 * @param comprobantes
	 */
	public void save(final List<Comprobante> comprobantes) throws DataAccessException;
	
	public Comprobante getComprobanteBySerieyFolio(
			final Negocio negocio, final String serie, String folio) throws DataAccessException;
	
	public List<Comprobante> getReport2010(final Negocio negocio, 
			final Calendar fechaInicio, final Calendar fechaFin) throws DataAccessException;
	
	public Comprobante getBySerieFolio(final String serie, final String folio, 
			final Negocio negocio) throws DataAccessException;
	
	/**
	 * Retrieve all the receipts with an specific externalID for a particular
	 * business
	 * @param negocio
	 * @param idExterno
	 * @return
	 */
	public List<Object[]> findComprobanteByIdExterno(final Negocio negocio, 
			final String idExterno) throws DataAccessException;

}
